class Date
{
       friend ostream& operator << (ostream& out, const Date& d);
       friend istream& operator >> (istream& in, Date& d);
public:
       Date(int year = 1, int month = 1, int day = 1)
              :_year(year)
              , _month(month)
              , _day(day)
       {}
       operator bool()
       {
              // 这里是随意写的，假设输入_year为0，则结束
              if (_year == 0)
                     return false;
              else
                     return true;
       }
private:
       int _year;
       int _month;
       int _day;
};
istream& operator >> (istream& in, Date& d)
{
       in >> d._year >> d._month >> d._day;
       return in;
}
ostream& operator << (ostream& out, const Date& d)
{
       out << d._year << " " << d._month << " " << d._day;
       return out;
}
// C++ IO流，使用面向对象+运算符重载的方式
// 能更好的兼容自定义类型，流插入和流提取
int main()
{
       // 自动识别类型的本质--函数重载
       // 内置类型可以直接使用--因为库里面ostream类型已经实现了
       int i = 1;
       double j = 2.2;
       cout << i << endl;
       cout << j << endl;
       // 自定义类型则需要我们自己重载<< 和 >>
       Date d(2022, 4, 10);
       cout << d;
       while (d)
       {
              cin >> d;
              cout << d;
       }
       return 0;
}